package com.cskaoyan.javase.thread._6pool;

import java.util.concurrent.*;

/**
 * 使用Callable 做运算 返回运算结果
 * 创建2个线程  1个线程计算1+2+3...100    另一个线程计算1+2+3+...200
 * 应该需要返回值,那就使用Callable任务
 *
 * @since 16:31
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Exercise {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        // 创建两个带有返回值的Callable任务
        CalcTask ct1 = new CalcTask(100);
        CalcTask ct2 = new CalcTask(200);
        // 下面有两种方式来执行这两个Callable任务
        // 1.用线程池
        ExecutorService es = Executors.newFixedThreadPool(2);
        System.out.println("1+2+3...100的结果是:" + es.submit(ct1).get());
        System.out.println("1+2+3...200的结果是:" + es.submit(ct2).get());
        es.shutdown();

        // 用FutureTask 多线程实现方式三

        FutureTask<Integer> f1 = new FutureTask<>(ct1);
        new Thread(f1).start();
        FutureTask<Integer> f2 = new FutureTask<>(ct2);
        new Thread(f2).start();

        System.out.println("1+2+3...100的结果是:" + f1.get());
        System.out.println("1+2+3...200的结果是:" + f2.get());
    }
}

class CalcTask implements Callable<Integer> {
    // num表示累加到的数
    private int num;

    public CalcTask(int num) {
        this.num = num;
    }

    @Override
    public Integer call() throws Exception {
        int result = 0;
        for (int i = 1; i <= num; i++) {
            result += i;
        }
        return result;
    }
}